#include <iostream>
#include "2pdm_optimal_irreps.h"
#include "3pdm_optimal_irreps.h"
#include "4pdm_optimal_irreps.h"

//----------------------------------------------------------------------------------------------------------------------------------------------------------

int main() {

  int Nsites = 4;

//  TwoPdmBlueprint Pdm(Nsites);
//  ThreePdmBlueprint Pdm(Nsites);
  FourPdmBlueprint Pdm(Nsites);

//  Pdm.printIrreps();
//  Pdm.printDMRGmap( );
//  Pdm.printBlockOps();

  std::map< char, std::set< std::vector< std::tuple<int,CRE_DES> > > > blockOps;
  std::set< std::vector< std::tuple<int,CRE_DES> > > opStrings;

  long int spaceStrings = 0;
  for (int site=2; site<=Nsites; site++) {
    //std::cout << "------------------------------\n";
    //std::cout << "Site = " << site << std::endl;

    // Get operator strings and which operators are needed on each block
    opStrings = Pdm.getSpaceStringsForSite(site);
    blockOps = Pdm.getSpatialOpsForSite(site);

    spaceStrings += opStrings.size();
    //std::cout << "# spatial operator strings = " << opStrings.size() << std::endl;
    //std::cout << "# spatial block operators  = " << blockOps['l'].size() + blockOps['d'].size() + blockOps['r'].size() << std::endl;

  };
  std::cout << "----------------------------------------\n";
  std::cout << "# spatial operator strings = " << spaceStrings << std::endl;
  std::cout << "----------------------------------------\n";

  return 0;
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------

